package com.draby.fantasy.dataTypes;

import com.draby.fantasy.exceptions.ParamsLengthNotMatchException;

/**
 * 圆形地图
 */
public class CircleMap extends Map {
    /**
     * 地图的直径(单位：格)
     * 执行初始化后只允许获取不允许设置
     */
    private int diameter;

    public int getDiameter() {
        return diameter;
    }

    /**
     * 初始化圆形地图，带一个参数，地图的半径
     * @return true: 初始化成功，否则返回 false
     * @throws ParamsLengthNotMatchException 参数长度不匹配异常
     */
    @Override
    public boolean initMap(int... values) throws ParamsLengthNotMatchException {
        if (values.length != 1) {
            throw new ParamsLengthNotMatchException("圆形地图需要且只需要定义地图的半径！");
        }
        diameter = values[0];       // 设置直径
        double radius = diameter / 2.0;     // 计算半径
        Block[][] maze = new Block[diameter][diameter];     // 根据直径大小创建地图大小
        // 此处为初始化的代码，以半径的形式分情况处理
        if (diameter % 2 != 0) {
            // 半径形如 N.5
            for (int i = 0; i < diameter; i++) {
                double y = (i * 2 + 1) * 0.5 - radius;
                for (int j = 0; j < diameter; j++) {
                    double x = (j * 2 + 1) * 0.5 - radius;
                    if (x * x + y * y > radius * radius) {
                        // 该格子中心到圆心距离大于半径，则置为不可达
                        maze[i][j] = new Block(i, j, -1);
                    } else {
                        maze[i][j] = new Block(i, j);
                    }
                }
            }
        } else {
            // 半径形如 N
            // 不太适合，需要考虑新算法
//            for (int i = 0; i < diameter; i++) {
//                double y = i - radius < 0 ? i - radius : i - radius + 1;
//                for (int j = 0; j < diameter; j++) {
//                    double x = j - radius < 0 ? j - radius : j - radius + 1;
//                    if (x * x + y * y > radius * radius) {
//                        // 该格子中心到圆心距离大于半径，则置为不可达
//                        maze[i][j] = new Block(i, j, -1);
//                    } else {
//                        maze[i][j] = new Block(i, j);
//                    }
//                }
//            }
        }
        // 保存地图
        setMaze(maze);
        return true;
    }
}
